###############################################################
###############################################################
## Questo Makefile conerolla  la compilazione del server, 
## del comando sfat_create e dei comandi client
## Inoltre contiene i target per effettuare la consegna finale
## del progetto ed il suo testing
##
## NOTA : la prima parte DEVE essere modificata per rispecchiare la 
## reale struttura del progetto sviluppato
###############################################################
###############################################################

# PARTE MODIFICABILE

#################File(s) *.c *.h da consegnare (sia in questa directory che in ../../Fat/Src)
FILE_DA_CONSEGNARE= ../../Fat/Src/Makefile ../../Fat/Src/*.c ../../Fat/Src/Include/*.h ./Makefile ./*.c ./Include/*.h ./*.pdf

# Specifica dove cercare gli include files
vpath %.h ../../Fat/Src/Include/
vpath %.h ./Include/

.PHONY: all clean doc test

# Directory di include
INC = ./Include

# usiamo gcc
CC = gcc

# Path per gli include files
CPPFLAGS = -I $(INC) -I ../../Fat/Src/Include/

# Path librerie
LIBS = -L ../../Fat/lib

# Compilation flag (con informazioni di coverage)
CFLAGS = -Wall -pedantic -g 

# Direcotry dove risiede la documentazione del client
CLIENT_DOC = ../Documentation

all: server sfat_create sfat_mkdir sfat_ls sfat_mkfile sfat_append sfat_read sfat_cp


lcscom.o: lcscom.c com_defs.h lcscom.h 
	$(CC) $(CFLAGS) $(CPPFLAGS)  -c -o $@  $<


# Target per la creazione del server
SERVOBJ = server.o lcscom.o
server : $(SERVOBJ)
	$(CC) $(CFLAG) $(CPPFLAGS) -o $@ $^ $(LIBS) -lfat -lpthread

server.o: server.c fat_defs.h load_fat.h sfaterror.h lcscom.h com_defs.h open_fat.h
	$(CC) $(CFLAGS) $(CPPFLAGS)  -c -o $@  $<

# Target per la creazione di sfat_mkdir
MKDIROBJ = sfat_mkdir.o lcscom.o
sfat_mkdir  : $(MKDIROBJ)
	$(CC) $(CFLAGS) $(CPPFLAGS) -o $@ $^ $(LIBS) -lfat

sfat_mkdir.o: sfat_mkdir.c fat_defs.h lcscom.h com_defs.h sfaterror.h
	$(CC) $(CFLAGS) $(CPPFLAGS)  -c -o $@  $<

# Target per la creazione di sfat_ls
LSOBJ = sfat_ls.o lcscom.o
sfat_ls  : $(LSOBJ)
	$(CC) $(CFLAGS) $(CPPFLAGS) -o $@ $^ $(LIBS) -lfat

sfat_ls.o: sfat_ls.c fat_defs.h lcscom.h com_defs.h sfaterror.h
	$(CC) $(CFLAGS) $(CPPFLAGS)  -c -o $@  $<

# Target per la creazione di sfat_mkfile
MKFILEOBJ = sfat_mkfile.o lcscom.o
sfat_mkfile  : $(MKFILEOBJ)
	$(CC) $(CFLAGS) $(CPPFLAGS) -o $@ $^ $(LIBS) -lfat

sfat_mkfile.o: sfat_mkfile.c fat_defs.h lcscom.h com_defs.h sfaterror.h
	$(CC) $(CFLAGS) $(CPPFLAGS)  -c -o $@  $<


# Target per la creazione di sfat_append
APPOBJ = sfat_append.o lcscom.o
sfat_append  : $(APPOBJ)
	$(CC) $(CFLAGS) $(CPPFLAGS) -o $@ $^ $(LIBS) -lfat

sfat_append.o: sfat_append.c fat_defs.h lcscom.h com_defs.h sfaterror.h
	$(CC) $(CFLAGS) $(CPPFLAGS)  -c -o $@  $<


# Target per la creazione di sfat_cp
CPOBJ = sfat_cp.o lcscom.o
sfat_cp  : $(CPOBJ)
	$(CC) $(CFLAGS) $(CPPFLAGS) -o $@ $^ $(LIBS) -lfat

sfat_cp.o: sfat_cp.c fat_defs.h lcscom.h com_defs.h sfaterror.h
	$(CC) $(CFLAGS) $(CPPFLAGS)  -c -o $@  $<



# Target per la creazione di sfat_read
READOBJ = sfat_read.o lcscom.o
sfat_read  : $(READOBJ)
	$(CC) $(CFLAGS) $(CPPFLAGS) -o $@ $^ $(LIBS) -lfat

sfat_read.o: sfat_read.c fat_defs.h lcscom.h com_defs.h sfaterror.h
	$(CC) $(CFLAGS) $(CPPFLAGS)  -c -o $@  $<



# Target per sfat_create
CROBJ=sfat_create.o
sfat_create: $(CROBJ)
	$(CC) $(CFLAGS) $(CPPFLAGS) -o $@ $^ $(LIBS) -lfat

sfat_create.o: sfat_create.c fat_defs.h sfaterror.h format.h
	$(CC) $(CFLAGS) $(CPPFLAGS)  -c -o $@  $<



##### NON MODIFICARE da QUA IN POI###############################
# Clean up target
clean:
	rm -f *~
	rm -f ./*.o


# Target per generare la documentazione 
# del client
doc:
	$(MAKE) --directory=$(CLIENT_DOC)

# target per il testing
test:
# prepariamo l'ambiente di test
	make -C  ../../Fat/Src clean
	make -C  ../../Fat/Src 
	make -C  ../../Fat/Src install
	-killall ./server
	-rm server
	-rm serverlog128 serverlog1024 serverlog2048 serverlog4096 out err serverlogpar
	make clean
	make all
	-rm -fr ./tmp
	mkdir ./tmp
# test sequenziale
	./sctest.sh 2>./err 1>./out
	diff ./serverlog128 ./serverlog.check
	diff ./serverlog1024 ./serverlog.check
	diff ./serverlog2048 ./serverlog.check
	diff ./serverlog4096 ./serverlog.check
	diff ./out ./out.check
# test parallelo 
	-killall ./server	
	./scpartest.sh
	cat .a? > out2
	diff out2 out2.check
	@echo -e "\a\n\t\t *** Test superato! ***\n"

######################################
SUBJECT="lcs07: consegna progetto finale"
consegna :
	make test
	../gruppo-check.pl < ../gruppo.txt
	tar -cvf $(USER)-f3.tar ../gruppo.txt $(FILE_DA_CONSEGNARE) 
	mpack -s $(SUBJECT) ./$(USER)-f3.tar  susanna@di.unipi.it
	@echo -e "\a\n*** Progetto Finale CONSEGNATO! ***\n"

